-
Notifications
You must be signed in to change notification settings - Fork 2
feat(be) : User 엔티티 및 기본 구조 설계 #20
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/domain/user/controller/GuideController.kt
🟢 좋은점:
- ApiResponse 사용: 모든 API 엔드포인트(getAllGuides, getGuideById, updateMyGuideProfile)가 ResponseEntity<ApiResponse>로 응답을 감싸서 일관된 표준 응답 형식을 따르고 있음. 성공 메시지도 적절히 포함되어 API의 가독성과 유지보수성을 높임.
- Kotlin 최적화: 컨트롤러 클래스와 메서드에서 null safety가 자연스럽게 적용됨 (명시적 nullable 타입 없음). private val로 의존성 주입을 명확히 하고, 제네릭 타입(List, GuideResponse)을 활용해 타입 안전성을 유지함. data class로 추정되는 DTO(GuideUpdateRequest, GuideResponse) 사용이 적절함.
- ktlint 규칙: 코드 포맷팅이 일관적이며, 네이밍 컨벤션(예: getAllGuides, updateMyGuideProfile)이 camelCase를 잘 따름. import 문도 불필요한 중복 없이 정리됨.
- Swagger 어노테이션(@tag, @operation)이 API 문서화를 위해 적절히 적용되어 개발자 경험을 향상시킴.
🟡 개선사항:
- Kotlin 최적화: @AuthenticationPrincipal guideId: Long 파라미터는 AuthenticationPrincipal이 Principal 객체(예: UserDetails)를 기대하므로, 직접 Long으로 바인딩되지 않을 수 있음. SpEL 표현식(예: @AuthenticationPrincipal expression = "principal.id")을 사용하거나, SecurityContextHolder를 통해 추출하는 확장 함수를 도입하면 더 안전하고 Kotlin다운 코드가 될 수 있음. 또한, when 표현식을 활용해 guideId 유효성 검사를 서비스 레이어로 위임하는 식으로 로직을 간소화할 수 있음.
- ktlint 규칙: 패키지 구조가 domain.guide.controller로 되어 있지만, DTO import가 domain.user.dto로 되어 있음 (Guide 관련 기능이 user 도메인에 속한 듯한 불일치). 패키지 재구성이나 import 경로를 명확히 정리하면 유지보수성이 높아짐. 메서드 내 ResponseEntity.ok() 호출을 반복하므로, 컨트롤러 확장 함수(예: fun
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/domain/user/controller/UserController.kt
🟢 좋은점:
- 모든 API 엔드포인트(getMyProfile, updateMyProfile, deleteMe)에서 ApiResponse를 ResponseEntity로 감싸서 일관된 응답 형식을 사용하고 있으며, 성공 메시지도 적절히 포함되어 표준 에러 응답과 조화될 수 있음.
- Kotlin 최적화 측면에서 private val로 의존성 주입(DI)을 명확히 하고, null safety를 고려한 타입(Long, UserUpdateRequest 등)을 사용하며, 간결한 함수 본문으로 불필요한 boilerplate를 피함.
- ktlint 규칙 준수: 코드 포맷팅이 깔끔하고, 네이밍 컨벤션(예: getMyProfile, updateMyProfile)이 camelCase로 일관되며, import 문이 불필요 없이 정렬됨.
- @operation 어노테이션으로 Swagger 문서화가 잘 되어 API의 목적(내 정보 조회/수정/탈퇴)이 명확함.
- @AuthenticationPrincipal을 활용해 인증된 사용자 ID를 안전하게 주입, 보안 측면에서 적절함.
🟡 개선사항:
- 글로벌 익셉션 처리(@ControllerAdvice)가 이 컨트롤러에서 직접 보이지 않으나, 서비스 레이어(userService)에서 발생할 수 있는 예외(예: UserNotFoundException)에 대한 핸들링을 가정하고 있음. 컨트롤러에서 try-catch를 추가하거나, 글로벌 핸들러가 표준 에러 응답(ApiResponse)을 반환하도록 확인 추천.
- Kotlin 최적화로 when 표현식이나 확장 함수를 활용할 여지가 있음(예: userService 호출 결과를 when으로 분기 처리하거나, ApiResponse 생성을 확장 함수로 추출하여 코드 중복 줄임). 현재는 간단하지만, API가 확장될 때 유용할 수 있음.
- deleteMe 메서드의 ApiResponse에서 메시지만 반환하는 것은 좋으나, 탈퇴 후 리다이렉트나 로그아웃 처리를 고려한 추가 로직(예: SecurityContext 로그아웃)이 필요할 수 있음.
🔴 문제점:
- 없음. 코드가 전체적으로 규칙을 잘 준수하며, 변경사항이 TODO에서 실제
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/domain/user/dto/UserRequest.kt
🟢 좋은점:
- 불필요한 TODO 기반 DTO 파일(UserRequest.kt)을 제거함으로써 코드베이스를 정리하고, 미구현된 코드를 유지하지 않아 유지보수성을 높임. 이는 Kotlin 최적화 측면에서 불필요한 data class를 제거한 것으로 긍정적임.
- ktlint 규칙 준수: 파일이 간단한 data class로 구성되어 있었으므로, 포맷팅이나 네이밍 컨벤션 위반이 없었음. 삭제로 인해 관련 규칙 준수 여부가 더 이상 해당되지 않음.
🟡 개선사항:
- 삭제 이유를 커밋 메시지나 주석으로 명확히 기록하는 것이 좋음 (예: "미구현 DTO 제거 - 향후 필요 시 재생성"). 만약 이 DTO가 다른 모듈(예: 컨트롤러나 서비스)에서 참조되었다면, 연쇄적인 리팩토링(예: null safety 확인)이 필요할 수 있음. Kotlin 최적화 관점에서, 삭제 후 관련 API가 ApiResponse로 제대로 감싸지는지 확인 추천.
🔴 문제점:
- 없음. 이 변경은 단순 삭제로, 글로벌 익셉션 처리나 ApiResponse 사용에 직접적인 영향을 주지 않음. 다만, 만약 이 DTO가 기존 API 엔드포인트에서 사용 중이었다면 컴파일 에러가 발생할 수 있으므로, 전체 빌드 테스트를 통해 확인해야 함.
d1e5cce to
2fbde5d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/domain/user/controller/GuideController.kt
🟢 좋은점:
- 모든 API 응답이
ResponseEntity<ApiResponse<T>>형식으로 일관되게 감싸여 있으며, 성공 메시지를 포함한 표준 응답 구조를 따르고 있습니다. 이는 ApiResponse 사용 규칙을 잘 준수합니다. - Kotlin의 null safety가 기본적으로 적용되어 있으며 (e.g.,
PathVariable Long은 Spring이 자동 변환하므로 nullable 이슈 없음), 코드가 간결하고 읽기 쉽습니다.when표현식이나 확장함수는 해당되지 않지만, 불필요한 null 체크가 과도하지 않아 최적화된 느낌입니다. - ktlint 규칙 준수: 네이밍 컨벤션 (camelCase 메서드/변수명), 포맷팅 (들여쓰기, import 순서)이 적절하며, 불필요한 공백이나 줄바꿈이 없습니다. Swagger 어노테이션(@tag, @operation)도 잘 활용되어 API 문서화가 명확합니다.
🟡 개선사항:
- Kotlin 최적화 측면에서, 서비스 호출 결과를 직접 반환하는 대신 ResponseEntity를 생성하는 부분을 확장 함수로 추출할 수 있습니다. 예:
inline fun <reified T> successResponse(message: String, data: T): ResponseEntity<ApiResponse<T>> = ResponseEntity.ok(ApiResponse(message, data)). 이는 반복 코드를 줄이고 가독성을 높일 수 있습니다. - 글로벌 익셉션 처리(@ControllerAdvice)가 프로젝트 전체에서 적용되어 있다고 가정하지만, 이 컨트롤러에서 서비스 호출 시 발생할 수 있는 예외 (e.g., GuideNotFoundException)를 명시적으로 try-catch로 감싸거나, 서비스 계층에서 ApiResponse를 반환하도록 조정하면 더 안전합니다. 현재는 서비스가 예외를 던지면 글로벌 핸들러에 의존하는 구조로 보입니다.
- import 경로에
domain.user.dto가 사용되었는데, 컨트롤러 패키지가domain.guide.controller입니다. 가이드가 사용자 도메인의 일부라면 패키지 구조를 재검토하거나, dto를domain.guide.dto로 이동하는 것이 도메인 일관성을 높일 수 있습니다.
🔴 문제점:
@AuthenticationPrincipal guideId: Long사용이
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/domain/user/controller/UserController.kt
🟢 좋은점:
- 모든 API 엔드포인트(getMyProfile, updateMyProfile, deleteMe)에서 ApiResponse를 일관되게 사용하여 표준화된 응답 형식을 유지하고 있음. 성공 메시지도 적절히 포함되어 사용자 경험을 향상시킴.
- Kotlin 최적화 측면에서 생성자 주입(private val userService)을 사용하고, 메서드 구현이 간결하며 null safety를 고려한 non-null 타입(Long, UserResponse 등)을 활용함. data class나 when 표현식은 DTO나 서비스 레이어에서 적용될 것으로 보이지만, 컨트롤러 레벨에서는 불필요하게 복잡하지 않음.
- ktlint 규칙 준수: 코드 포맷팅이 깔끔하고, 네이밍 컨벤션(예: getMyProfile, updateMyProfile)이 camelCase로 일관되며, 임포트와 주석이 적절함.
- Swagger @operation 어노테이션을 통해 API 문서화가 잘 되어 있음. @RestController와 @RequestMapping으로 RESTful 구조를 명확히 함.
🟡 개선사항:
- @AuthenticationPrincipal userId: Long 파라미터는 편리하지만, 실제 Authentication 객체(예: UserDetails)에서 userId를 추출하는 커스텀 변환기를 사용 중이라면 주석으로 명시하거나, 타입 안전성을 위해 UserDetails를 직접 주입받아 userId를 추출하는 방식을 고려. (현재는 가정컨대 동작하지만, 명확성 향상)
- deleteMe 메서드의 ApiResponse에서 반환 타입이 Unit이므로, 성공 응답 시 HTTP 204 No Content를 고려하거나, 메시지만으로 충분하다면 현재 상태 유지. 하지만 일관성을 위해 다른 메서드처럼 UserResponse를 반환하지 않고 비우는 대신, "회원 탈퇴가 완료되었습니다." 메시지를 더 구체적으로(예: "계정이 안전하게 삭제되었습니다.") 조정 가능.
- 글로벌 익셉션 처리(@ControllerAdvice)는 컨트롤러 레벨에서 직접 보이지 않지만, 서비스 레이어(userService)에서 발생할 수 있는 예외(예: UserNotFoundException)에 대한 핸들링이 글로벌로 위임된다고 가정. 컨트롤러에서 try-catch를 추가
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/domain/user/dto/UserRequest.kt
🟢 좋은점:
- Kotlin 최적화 측면에서 data class를 사용한 간결한 DTO 구조가 적절했으나, 삭제로 인해 불필요한 TODO 코드를 제거하여 코드베이스를 정리한 점이 긍정적입니다. 이는 유지보수성을 높이는 데 기여합니다.
- ktlint 규칙 준수: 기존 코드가 간단한 data class로 포맷팅과 네이밍(예: camelCase)이 표준에 맞아 문제없었습니다.
🟡 개선사항:
- 삭제된 DTO가 다른 모듈(예: Controller나 Service)에서 참조되는지 확인하세요. 만약 참조가 있다면, 대체 DTO나 로직 변경을 통해 의존성을 업데이트하는 것이 좋습니다. (Kotlin 최적화: null safety를 고려한 대체 구현 시 when 표현식 등을 활용할 수 있음)
- 향후 사용자 등록/수정 기능 구현 시, 이 DTO를 재생성할 계획이라면 문서화(예: 주석이나 이슈 트래커)로 추적성을 높이세요.
🔴 문제점:
- 글로벌 익셉션 처리나 ApiResponse 사용과 직접 관련은 없으나, 이 DTO가 API 요청 바디로 사용될 예정이었다면 삭제로 인해 해당 API 엔드포인트의 응답/요청 구조가 불완전해질 수 있습니다. 모든 API가 ApiResponse로 감싸야 한다는 규칙을 위반할 위험이 있으니, 관련 Controller를 검토해 표준 에러 응답과 일관성을 유지하세요. 컴파일/런타임 에러 발생 시 즉시 수정 필요.
close #2